package com.luyang.framework.redis;

import cn.hutool.core.lang.Assert;
import cn.hutool.core.text.CharSequenceUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.concurrent.TimeUnit;

/**
 * Redis 操作类
 *
 * @author lu_yang
 */
@SuppressWarnings("all")
public class RedisService {

    private static final Logger logger = LoggerFactory.getLogger(RedisService.class);

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    // region 普通缓存操作

    /**
     * 根据KEY获取指定缓存
     *
     * @param k 键
     * @return T
     * @author lu_yang
     */
    public <T> T get(String k) {
        return CharSequenceUtil.isBlank(k) ? null : (T) redisTemplate.opsForValue().get(k);
    }

    /**
     * 将指定的 key、value 放到 Redis 中
     *
     * @param k 键
     * @param v 值
     * @author lu_yang
     */
    public <T> boolean set(String k, T v) {

        Assert.notBlank(k, "缓存KEY为空");
        try {
            this.redisTemplate.opsForValue().set(k, v);
            return true;
        } catch (Exception e) {
            logger.error("设置缓存异常", e);
            return false;
        }
    }

    /**
     * 将指定的 key、value 放到 Redis 中,并指定过期时间
     *
     * @param k    键
     * @param v    值
     * @param time 过期时间，单位:秒
     * @return boolean
     * @author lu_yang
     */
    public <T> boolean set(String k, T v, long time) {

        Assert.notBlank(k, "缓存KEY为空");
        try {
            if (time > 0) {
                this.redisTemplate.opsForValue().set(k, v, time, TimeUnit.SECONDS);
            } else {
                this.set(k, v);
            }
            return true;
        } catch (Exception e) {
            logger.error("设置缓存异常", e);
            return false;
        }
    }

    // endregion 字符串相关操作
}
